package LeeJS;

public class J17_OOP3 {
	
	/*
			
			this 연산자, this 생성자
			멤버변수에 사용하는 this 는 현재 객체 자신을 의미함
			생성자에 사용하는 this 는 코드 간결성을 위해 사용함
			
	 */
	
	public static void main(String[] args) {
		
		//생성자를 이용해 객체를 만들고
		//멤버변수에 값을 직접 초기화
		
		Member user01 = new Member();
		user01.userid = "zzzz";
		user01.passwd = "zzzz";
		
		//기본 생성자만을 사용해 멤버변수 초기화
		Member user02 = new Member();
		user02.showInfo();
		Member user03 = new Member();
		user03.showInfo();
		
		//인자있는 생성자로 객체 생성
		Member user04 = new Member("qw","ew");
		user04.showInfo();
		
		car mycar01 = new car();
		car mycar02 = new car("BMW", "Red");
		
		
	}
	
}
//class

class Member {
	
	String userid;
	String passwd;
	
	//기본 생성자 - 인자 없음
	public Member(){
		userid = "zz";
		passwd = "zz";
	}
	
	//사용자 정의생성자 - 인자 있음
	
	public Member(String myuserid, String mypasswd){
		userid = myuserid;
		passwd = mypasswd;
	}
	
	
	
	//회원정보 출력 showInfo
	
	void showInfo(){
		
		System.out.println(userid);
		System.out.println(passwd);
		
		}
		
	}
	
class car {
	String brand;
	String color;
	
	public car(){}
	
	/*
		
		인자 있는 생성자를 사용하는 경우
		기본 생성자도 직접 만들어 줘야 함
		
	 */
	
	public car(String mybrand, String mycolor){
		
		brand = mybrand;
		color = mycolor;
		
	}

class DVD {
	
	int dvdno;
	String dvdtitle;
	String genre;
	
	public DVD() {}
	
	public DVD(int mydvdno, String dvdtitle, String genre) {
		
		
		/*
				생성자의 인자명과 멤버변수명은 동일하게 작성
				왜냐하면 생성자의 인자명을 새로 짓는 것은 귀찮기 때문
				생성자의 인자명과 멤버변수명이 서로 같은 경우
				
				그런데 생성자의 인자명과 멤버변수명이 서로 같은 경우 
				멤버변수가리기 shadowing 현상이 발생
				따라서, 클래스의 멤버변수는 this 연산자를 이용해서 가리기 현상을 방지
				
		dvdno = dvdno;
		dvdtitle = dvdtitle;
		genre = genre;
		*/
		
		this.dvdno = dvdno;
		this.dvdtitle = dvdtitle;
		this.genre = genre;
	}
}

class book {
	int bookno;
	String booktitle;
	String genre;
	
	public book(){}
	
	public book(int bookon){
		
		this.bookno = bookno;
		
	}
	
	public book(String booktitle){
		this.booktitle = booktitle;
	}
	
	public book(int bookno, String booktitle){
		//this.bookno = bookno;
		//this.booktitle = booktitle;
		//book(bookno);		//첫번째 줄 코드를 간단하게 쓰기
		//book(booktitle);	//두번째 줄 코드를 간단하게 쓰기
		this(bookno);		//첫번째 줄 코드를 this()로 대체
		//this(booktitle);	//두번째 줄 코드를 this()로 대체
		//단 this()는 언제나 코드의 맨 처음에 나와야 함
	}
	
}

}